#!/usr/bin/python
# -*- coding: UTF-8 -*-

"""
@author: jiu
@contact: 643562684@qq.com
@time: 2022/3/7 11:06
"""

"""
测试依赖和关联  可以直接打标记在类上或者在函数上
"""


import unittest
import functools


def dependon(depend=None):  # 定义一个 装饰器 参数 被依赖的函数名称
    def wraper_func(test_func):  # 默认传参：被修饰的函数
        @functools.wraps(test_func)
        def inner_func(self):  # 判断函数
            if depend == test_func.__name__:  # 判断依赖的函数，是否和自身是否是一个函数
                raise ValueError("{} cannot depend on itself".format(depend))
            failures = str([fail[0] for fail in self._outcome.result.failures])  # 获得所有断言失败的函数
            errors = str([error[0] for error in self._outcome.result.errors])  # 获得所有发生错误的函数
            skipped = str([error[0] for error in self._outcome.result.skipped])  # 获得所有已经跳过的函数
            flag = (depend in failures) or (depend in errors) or (depend in skipped)  # 判断依赖的函数是否在发生错误的函数中
            test = unittest.skipIf(flag, 'Skip because def:{} is not running'.format(depend))(
                test_func)  # 交给unittest.skipIf函数处理
            return test(self)  # 返回 unittest.skipIf 处理结果

        return inner_func  # 返回 inner_func 处理结果

    return wraper_func  # 返回 wraper_func 处理结果


def depend(case=''):
    _mark = []

    def wrap_func(fun):
        @functools.wraps(fun)
        def inner_fun(self):
            if case == fun.__name__:
                raise ValueError("{} cannot depend on itself".format(case))
            _r = self._outcome.result
            _f, _e, _s = _r.failures, _r.errors, _r.skipped
            if not (_f or _e or _s):
                fun(self)
            if _f:
                _mark.extend([fail[0] for fail in _f])
            if _e:
                _mark.extend([error[0] for error in _e])
            if _s:
                _mark.extend([skip[0] for skip in _s])

            print(_mark)
            unittest.skipIf(
                case in str(_mark),
                "Skip because def:{} is not running".format(case)
            )(fun)(self)

        return inner_fun

    return wrap_func


